package model

import (
	"github.com/jinzhu/gorm"
	_const "go-admin/internal/model/const"
)

// 字典项
type DictItem struct {
	CommonModel
	IsBanned string `json:"isBanned"` // 是否禁用
	Remark   string `json:"remark"`   // 备注信息
	DictType string `json:"dictType"` // 字典类型
	DictId   string `json:"dictId"`   // 字典id
	Label    string `json:"label"`    // 字典选项标题
	Value    string `json:"value"`    // 字典选项值
	Sort     int64  `json:"sort"`     // 排序
}

// 重置表名
func (d *DictItem) TableName() string {
	return "sys_dict_item"
}

// 获取总数
func (d *DictItem) Count(db *gorm.DB) (int, error) {
	var count int
	if d.IsBanned != "" {
		db = db.Where("is_banned = ?", d.IsBanned)
	}
	if d.DictType != "" {
		db = db.Where("dict_type = ?", d.DictType)
	}
	if d.Label != "" {
		db = db.Where("label LIKE ?", "%"+d.Label+"%")
	}
	if err := db.Model(&d).Where("is_del = ?", _const.ISDEL).Count(&count).Error; err != nil {
		return 0, err
	}
	return count, nil
}

// 创建
func (d *DictItem) Create(db *gorm.DB) (string, error) {
	return d.Id, db.Create(&d).Error
}

// 获取列表
func (d *DictItem) List(db *gorm.DB, pageOffset, pageSize int) ([]*DictItem, error) {
	var dictItems []*DictItem
	var err error
	db = db.Offset(pageOffset).Limit(pageSize)
	if d.IsBanned != "" {
		db = db.Where("is_banned = ?", d.IsBanned)
	}
	if d.DictType != "" {
		db = db.Where("dict_type = ?", d.DictType)
	}
	if d.Label != "" {
		db = db.Where("label LIKE ?", "%"+d.Label+"%")
	}
	if err = db.Where("is_del = ?", _const.ISDEL).Find(&dictItems).Error; err != nil {
		return nil, err
	}
	return dictItems, nil
}

// 更新
func (d *DictItem) Update(db *gorm.DB, values interface{}) error {
	if err := db.Model(&d).Updates(values).Where("id = ?", d.Id).Error; err != nil {
		return err
	}
	return nil
}

// 批量软删除
func (d *DictItem) Deletes(db *gorm.DB, ids []string, values interface{}) error {
	return db.Model(&d).Where("id IN (?)", ids).Updates(values).Error

}

// 通过字典名称和类型获取字典
func (d *DictItem) GetDictByDictItemLabelAndValueByDictType(db *gorm.DB) (*DictItem, error) {
	var dictItem DictItem
	if err := db.Where("is_del = ?", _const.ISDEL).Where("label = ? OR value = ?", d.Label, d.Value).Where("dict_type = ?", d.DictType).First(&dictItem).Error; err != nil {
		// 判断错误
		switch {
		case err == gorm.ErrRecordNotFound:
			// 说明没有找到
			return &dictItem, nil
		case err != nil:
			return &dictItem, err
		}
	}
	return &dictItem, nil
}

func (d *DictItem) DictItemList(db *gorm.DB, dictType string) ([]*DictItem, error) {
	var dictItems []*DictItem
	var err error
	if err = db.Where("is_del = ?", _const.ISDEL).Where("dict_type = ?", dictType).Find(&dictItems).Error; err != nil {
		return nil, err
	}
	return dictItems, nil
}

// 根据id获取详情
func (d *DictItem) GetDictItemById(db *gorm.DB) (*DictItem, error) {
	var dictItem DictItem
	if err := db.Where("id = ?", d.Id).First(&dictItem).Error; err != nil {
		// 判断错误
		switch {
		case err == gorm.ErrRecordNotFound:
			// 说明没有找到
			return &dictItem, nil
		case err != nil:
			return &dictItem, err
		}
	}
	return &dictItem, nil
}
